// 拦截器 统一处理返回结果
/**
 *  1. 在函数执行之前、之后绑定额外的逻辑
    2. 转换函数的返回结果
    3. 转换从函数抛出的异常
    4. 扩展基本函数的行为
    5. 根据所选条件重写函数
 * 
 */

import {
  Injectable,
  NestInterceptor,
  ExecutionContext,
  HttpStatus,
  CallHandler,
} from '@nestjs/common';
import { Response, Request } from 'express';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
interface IResponce<T> {
  data: T;
}

@Injectable() // 用于标记一个类可以作为依赖项注入到其他类中
export class TransformInterceptor<T>
  implements NestInterceptor<T, IResponce<T>>
{
  intercept(
    context: ExecutionContext,
    next: CallHandler,
  ): Observable<IResponce<T>> {
    // 因为nestjs使用REST API风格，对于post请求默认返回201，所以需要手动处理成200
    const request = context.switchToHttp().getRequest<Request>();
    const response = context.switchToHttp().getResponse<Response>();

    if (request.method == 'POST' && response.statusCode == HttpStatus.CREATED) {
      response.status(HttpStatus.OK); // 强制设置状态码为 200
    }

    return next.handle().pipe(
      map((data) => {
        let code = data.code || 200;
        return {
          data: data.result || data.response || data,
          code: code,
          message: 'success',
        };
      }),
    );
  }
}
